package com.xyh.concurrency.example.singleton;

import lombok.extern.slf4j.Slf4j;

import java.util.concurrent.locks.AbstractQueuedLongSynchronizer;

@Slf4j
/**
 * 懒汉模式就是单例模式在使用的时候创建,第一次
 */
public class SingletonExample {
    private SingletonExample() {
    }


    private volatile static SingletonExample singletonExample = null;

    /**
     * 创建单例工厂
     * 线程安全,但是会阴阳小路
     *
     * @return
     */
    public static synchronized SingletonExample getSingletonExample() {
        if (singletonExample == null) {
            singletonExample = new SingletonExample();
        }
        return singletonExample;
    }

    //这样还是会出现线程不安全的问题

    /**
     * 对象的创建的几步
     * 1 memory = allocate() 分配对象内存空间
     * 2 ctorInstance() 初始化对象
     * 3 singletonExample =  memory 将内置进行指引
     * cup 的指令重排就会出现安全的问题
     * 发生机率不是很大
     * 增加volatile 实现cpu重排
     */
    public static synchronized SingletonExample getSingletonExample2() {
        if (singletonExample == null) {
            synchronized (SingletonExample.class) {
                if (singletonExample == null) {
                    singletonExample = new SingletonExample();
                }
            }

        }
        return singletonExample;
    }


    /**
     * 在多线程的情况下就会出现对象多次创建的情况
     *
     * @return
     */
    public static SingletonExample getSingletonExample1() {
        if (singletonExample == null) {
            singletonExample = new SingletonExample();
        }
        return singletonExample;
    }
}
